package com.plugin.controller;

import com.api.client.IdClient;
import com.common.domain.po.Plugin;
import com.common.result.Result;
import com.plugin.service.PluginService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * @author 路亚
 * @version 0.1
 * @className PluginController
 * @description
 * @date 2025/1/3 20:08
 * @since jdk11
 */
@RestController
@RequestMapping("/plugin")
@Slf4j
@RequiredArgsConstructor
public class PluginController {

    private final PluginService pluginService;

    private final IdClient idClient;

    private static final String PLUGIN_TYPE = "plugin";

    /**
     * 插件服务是第一次写，所以这里加上注释
     * 插件的本质就是一个个 jar 包，而插件服务就是来管理这一个个的 jar 包的（把 jar 包上传到插件服务中）
     * 存储这些 jar 包的目的，最终使用 类加载器 执行其中的代码
     * 好处：可以保证代码 7*24 不间断运行，从而方便我们扩展项目
     */

    /**
     * 大致实现思路：
     * 供应商服务计算完视频收益后，远程调用插件服务
     * 获取插件服务中的信息，信息包括要调用jar包保存路径、执行的类名、执行的方法名等信息
     * 有了这些信息，就可以使用classLoader加载jar包，然后执行其中的方法
     * 这样就可以做到动态调用jar包中的方法，不需要重启主服务的代码，只需要重启插件服务即可
     * 我的理解是有点像远程调用方法，只不过这个方法是可以动态修改的
     */

    @GetMapping("/getById")
    public Plugin getById(Long id) {
        return pluginService.getById(id);
    }

    @PostMapping("/add")
    public Result add(Plugin plugin) {
        plugin.setId(idClient.getLongKeyInterval(PLUGIN_TYPE));
        pluginService.save(plugin);
        return Result.success();
    }

    @DeleteMapping("/deleteById")
    public Result deleteById(Long id) {
        pluginService.removeById(id);
        return Result.success();
    }

    @PostMapping("/update")
    public Result update(Plugin plugin) {
        pluginService.updateById(plugin);
        return Result.success();
    }
}
